from django.contrib.auth.models import AbstractUser
from django.db import models

from meiduo.utils.BaseModel import BaseModel


# Create your models here.


# 创建用户类的表,继承django的AbstractUser类，具有以下属性
# 创建用户必选：username、password
# 创建用户可选：email、first_name、last_name、last_login、date_joined、is_active 、is_staff、is_superuse
# 这里新增属性：mobile属性
class User(AbstractUser):
    """用户"""
    # 创建mobile手机号字段，最大长度为11位，不能重复
    mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号')

    # 创建email_active邮箱验证状态字段，用于记录邮箱是否激活，默认为False：未激活
    email_active = models.BooleanField(default=False, verbose_name='邮箱验证状态')

    # 创建default_address外键，记录用户默认地址
    default_address = models.ForeignKey(
        'Address',
        related_name='users',
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        verbose_name='默认地址'
    )

    # 对当前表进行相关设置:
    class Meta:
        db_table = 'tb_users'  # 表名
        verbose_name = '美多用户'
        verbose_name_plural = verbose_name

    # 在 str 魔法方法中, 返回用户名称
    def __str__(self):
        return self.username


# 增加地址的模型类, 放到User模型类的下方:
class Address(BaseModel):
    """用户地址"""
    user = models.ForeignKey(
        'User',
        on_delete=models.CASCADE,
        related_name='addresses',
        verbose_name='用户'
    )
    province = models.ForeignKey(
        'areas.Area',
        on_delete=models.PROTECT,
        related_name='province_addresses',
        verbose_name='省'
    )
    city = models.ForeignKey(
        'areas.Area',
        on_delete=models.PROTECT,
        related_name='city_addresses',
        verbose_name='市'
    )
    district = models.ForeignKey(
        'areas.Area',
        on_delete=models.PROTECT,
        related_name='district_addresses',
        verbose_name='区'
    )

    title = models.CharField(max_length=20, verbose_name='地址名称')
    receiver = models.CharField(max_length=20, verbose_name='收货人')
    place = models.CharField(max_length=50, verbose_name='地址')
    mobile = models.CharField(max_length=11, verbose_name='手机')
    tel = models.CharField(
        max_length=20,
        null=True,
        blank=True,
        default='',
        verbose_name='固定电话'
    )
    email = models.CharField(
        max_length=30,
        null=True,
        blank=True,
        default='',
        verbose_name='电子邮箱'
    )

    is_deleted = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'tb_address'
        verbose_name = '用户地址'
        verbose_name_plural = verbose_name
        ordering = ['-update_time']
